#import pputil;
local adjust = pputil.slicedata.adjust;
local tb=table();
local head = "# comac datafile version 1.0";
//删除表中项
tb.d_tems=function(tb1,x)
{
	if(is_array(x))
	{
		for_each(v in x)
		{
			tb1[v]=nil;
		}
	}else
	{
		tb1[x]=nil;
	}
  return table.remove_nil(tb1);
};
//title 合并 a=["time","ns","key"],b=["mag(Ex)","V/m","value"],title=pack(a,b)
tb.title_union = function (title)
{
    local title_whole="# ";
    for (k,v in title)
    {
        if(is_array(v))
        {
            v=string.join("||",v);
        }
        title_whole = title_whole..v..?(k!=title.length()-1,",","");
    }
    return title_whole;
};

tb.Slice_F_single=function (m,index,Eflag,flag,nu,nv,coorduv)   //m 需指定到 name[0] //coorduv=pack(u,v)
{
	if(is_nil(index))
	{index=0;}// 指定第0个频点
	local array_data=[];
   // local m = name;    // 指定监视器结果节点，[0]表示第0次被引用的结果
   local data,plane,freq;
	if(numel(Eflag)==2 && Eflag[0]!='S')
	{
        data = m.data[index];     // 取出数据
        plane = m.coord.plane;
        freq=m.freq[index];
    }else if (Eflag[0]=='S')
    {
        data = m.Sdata[index];     // 取出数据
        plane = m.Eu.coord.plane;
        freq=m.freq[index];
    }else
    {
        return 0;
    }
	data = adjust(data, plane); // 调整数据维度到局部坐标系排列方式

	local cs = [m.coord.x, m.coord.y, m.coord.z];
	local ucoord0 = cs[(plane+1)%3];
	local vcoord0 = cs[(plane+2)%3];
    local info=["X","Y","Z"][(plane+1)%3]..["X","Y","Z"][(plane+2)%3];
    if (plane==1)  //zox平面 调整为 xoz
    {
        data = transpose(data);
        ucoord0 = cs[0];
        vcoord0 = cs[2];
        info ="XZ";

    }

	local umin = min(ucoord0);
	local umax = max(ucoord0);
	local vmin = min(vcoord0);
	local vmax = max(vcoord0);
	//local nu = 201; // 指定u方向重采样的点数
	//local nv = 201; // 指定u方向重采样的点数
	local ret=table()
	if(flag)
	{
		local us = linspace(umin, umax, nu);
		local vs = linspace(vmin, vmax, nv);
        if(!is_nil(coorduv))
        {
            us=coorduv[0];
            vs=coorduv[1];
        }
		local data1 = math.interp2(ucoord0, vcoord0, data)(us, vs);
		ret.uc=clone(us);
		ret.vc=clone(vs);
		//ret.rdata=real(data1);
		//ret.idata=imag(data1);
        array_data=data1;
	}else
	{
		ret.uc=clone(ucoord0);
		ret.vc=clone(vcoord0);
		//ret.rdata=real(data);
		//ret.idata=imag(data);
        array_data=data;
	}
	
	
	ret.freq=freq;
	ret.data=array_data;
	ret.info=info;
	ret.Edir=Eflag;
    ret.plane=plane;
	return ret;
 };
tb.Slice_F_vec=function (m,index,Eflag,user_coord,nu,nv) 
{
        local coordx,coordy,coordz,plane,coorduv;
        if(Eflag=="Evec"||Eflag=="EVec"||Eflag =="Evec&Hvec"||Eflag =="EVec&HVec")
        {
            coordx = m.Ex.coord;
            coordy = m.Ey.coord;
            coordz = m.Ez.coord;
            plane = m.Ex.coord.plane;
        }else
        {
            coordx = m.Hx.coord;
            coordy = m.Hy.coord;
            coordz = m.Hz.coord;
            plane = m.Hx.coord.plane;
        }
        local tmp_x = sort(cat(0,coordx.x,coordy.x));  
        local tmp_y = sort(cat(0,coordx.x,coordy.y));
        local tmp_z = sort(cat(0,coordx.x,coordz.z));
        local numx = max(numel(coordx.x),numel(coordy.x)); //目的统一一个维度的数据大小
        local numy = max(numel(coordx.x),numel(coordy.y));
        local numz = max(numel(coordx.x),numel(coordz.y));
        local nu1=?(numx==1,numy,numx);
        local nv1=?(numz==1,numy,numz);
        if(!is_nil(nu))
        {
            nu1= nu;
        }
        if(!is_nil(nv))
        {
            nv1= nv;
        }
        local range;
        if(!is_nil(user_coord))
        {
            range = user_coord;
        }else
        {
            range =[tmp_x[0],tmp_y[0],tmp_z[0],tmp_x[end],tmp_y[end],tmp_z[end]];
        }
        local ucoord1,vcoord1;
        if(plane==0)  //2 xoy 1 zox 0 yoz
        {
            ucoord1 = linspace(range[1],range[4],nu1); //y
            vcoord1 = linspace(range[2],range[5],nv1); //z
        }else if(plane==1)
        {
            ucoord1 = linspace(range[0],range[3],nu1);//x
            vcoord1 = linspace(range[2],range[5],nv1); //z
        }else
        {
            ucoord1 = linspace(range[0],range[3],nu1);//x
            vcoord1 = linspace(range[1],range[4],nv1); //y
        }
        coorduv=pack(ucoord1,vcoord1);

        if (Eflag=="EVec")
        {
            local Ex=this.Slice_F_single(m.Ex,index,"Ex",1,nu1,nv1,coorduv);
            local Ey=this.Slice_F_single(m.Ey,index,"Ey",1,nu1,nv1,coorduv);
            local Ez=this.Slice_F_single(m.Ez,index,"Ez",1,nu1,nv1,coorduv);
            local tmp_data= pack(Ex,Ey,Ez);
            return tmp_data;
        }else if(Eflag=="HVec")
        {   
            local Hx=this.Slice_F_single(m.Hx,index,"Hx",1,nu1,nv1,coorduv);
            local Hy=this.Slice_F_single(m.Hy,index,"Hy",1,nu1,nv1,coorduv);
            local Hz=this.Slice_F_single(m.Hz,index,"Hz",1,nu1,nv1,coorduv);
            local tmp_data= pack(Hx,Hy,Hz);
            return tmp_data;
        }else
        {
            local Ex=this.Slice_F_single(m.Ex,index,"Ex",1,nu1,nv1,coorduv);
            local Ey=this.Slice_F_single(m.Ey,index,"Ey",1,nu1,nv1,coorduv);
            local Ez=this.Slice_F_single(m.Ez,index,"Ez",1,nu1,nv1,coorduv);
            local Hx=this.Slice_F_single(m.Hx,index,"Hx",1,nu1,nv1,coorduv);
            local Hy=this.Slice_F_single(m.Hy,index,"Hy",1,nu1,nv1,coorduv);
            local Hz=this.Slice_F_single(m.Hz,index,"Hz",1,nu1,nv1,coorduv);
            local tmp_data=pack(Ex,Ey,Ez,Hx,Hy,Hz);
            return tmp_data;
        }
};

//保存1d数据
tb.Save_1d=function(fn,data,title,_format)
{
    if(is_nil(_format))
    {
        _format="%.7e";
    }
    local ss=stream.open(fn,stream.TruncateCreateMode);
    ss.writeln(head);
    if(!is_nil(title))
    { 
        title=this.title_union(title);
        ss.writeln(title);
    }
    local mdim=size(data);
    local ni=mdim[0];
    local nj=mdim[1];
    local str1 = string.repeat(','.._format,nj)[1:end];
    for(local ii=0;ii<ni;ii++)
    {
        ss.writeln(format(str1,unpack(data[ii,:])));
    }
    ss.close();
};

//保存2d数据
tb.Save_2d=function(fn,u,v,data,title,_format)
{
    if(is_nil(_format))
    {
        _format="%.7e";
    }
    local ss=stream.open(fn,stream.TruncateCreateMode);
    ss.writeln(head);
    if(!is_nil(title))
    { 
        title=this.title_union(title);
        ss.writeln(title);
    }
    local flag=0;    //0 值为实数 1值为虚数
    if(10==typeid(data))   //pack(a,b,c)   [[]、[]、[]]
    {
        local mdim=size(data[0]);
        local ni=mdim[0];
        local nj=mdim[1];
        local num= numel(data);  
        local str1 = string.repeat(','.._format,2+num)[1:end];
        //printex(data[0])
        if(4==typeid(data[0][0]))   //复数形式
        {
            str1 = string.repeat(','.._format,2+num*2)[1:end];
            flag = 1;
        }
        local tmp_data=[];
        for(local jj=0;jj<nj;jj++)
        {
            for(local ii=0;ii<ni;ii++)
            {
                tmp_data=[u[ii],v[jj]];
                for(local kk=0;kk<num;kk++)
                {
                    
                    if(flag)
                    {
                        tmp_data.push(real(data[kk][ii,jj]));
                        tmp_data.push(imag(data[kk][ii,jj]));
                    }
                    else
                    {
                        tmp_data.push(data[kk][ii,jj]);
                    }
                
                }
                ss.writeln(format(str1,unpack(tmp_data)));
            }
        }
        ss.close();
    }
    else
    {
        local mdim=size(data);
        local ni=mdim[0];
        local nj=mdim[1];
        local str1 = string.repeat(','.._format,3)[1:end];
        //printex(data[0])
            if(4==typeid(data[0]))   //复数形式
            {
                str1 = string.repeat(','.._format,4)[1:end];
                flag =1;
            }
        local tmp_data=[];
        for(local jj=0;jj<nj;jj++)
        {
            for(local ii=0;ii<ni;ii++)
            {
                 tmp_data=[u[ii],v[jj]];
                if(flag)
                {
                    tmp_data.push(real(data[ii,jj]));
                    tmp_data.push(imag(data[ii,jj]));
                }else
                {
                    tmp_data.push(data[ii,jj]);
                }
                
            }
            ss.writeln(format(str1,unpack(tmp_data)));
        }
        ss.close();
    }  
};

/*
tb.Save_3d=function(fn,u,v,n,data,title,_format)
{
    if(is_nil(_format))
    {
        _format="%.7e";
    }
    local ss=stream.open(fn,stream.TruncateCreateMode);
    ss.writeln(head);
    if(!is_nil(title))
    { 
        title=this.title_union(title);
        ss.writeln(title);
    }
    local flag=0;    //0 值为实数 1值为虚数
    if(10==typeid(data))   //pack(a,b,c)   [[]、[]、[]]
    {
        local mdim=size(data[0])
        local ni=mdim[0];
        local nj=mdim[1];
        local nk=mdim[2];
        local num= numel(data);  
        local str1 = string.repeat(','.._format,3+num)[1:end];
        if(4==typeid(data[0][0,0]))   //复数形式
        {
            str1 = string.repeat(','.._format,3+num*2)[1:end];
            flag = 1;
        }
        local tmp_data=[];
        for(local kk=0;kk<nk;kk++)
        {
            for(local jj=0;jj<nj;jj++)
            {
                for(local ii=0;ii<ni;ii++)
                {
                    temp_data[u[ii],v[jj],n[kk]];
                    for(local ncount=0;ncount<num;ncount++)
                    {
                        if(flag)
                        {
                            tmp_data.push(real(data[ncount][ii,jj,kk]));
                            tmp_data.push(imag(data[ncount][ii,jj,kk]));
                        }
                        else
                        {
                            tmp_data.push(data[ncount][ii,jj,kk]);
                        }
                    }
                ss.writeln(format(str1,unpack(tmp_data)));
                }
            }
        }
        ss.close();
    }else
    {
        local mdim=size(data)
        local ni=mdim[0];
        local nj=mdim[1];
        local nk=mdim[2];
        local str1 = string.repeat(','.._format,4)[1:end];
        if(4==typeid(data[0][0,0]))   //复数形式
        {
            str1 = string.repeat(','.._format,5)[1:end];
            flag = 1;
        }
        local tmp_data=[];
        for(local kk=0;kk<nk;kk++)
        {
            for(local jj=0;jj<nj;jj++)
            {
                for(local ii=0;ii<ni;ii++)
                {
                    temp_data[u[ii],v[jj],n[kk]];
                    if(flag)
                    {
                        tmp_data.push(real(data[ii,jj,kk]));
                        tmp_data.push(imag(data[ii,jj,kk]));
                    }
                    else
                    {
                        tmp_data.push(data[ii,jj,kk]);
                    }
                ss.writeln(format(str1,unpack(tmp_data)));
                }
            }
        }
        ss.close();
        
    }
};
*/
return tb;